package com.yhsoft.common.utils;

import java.time.LocalDate;
import java.util.Random;
import java.util.UUID;

/**
 * @author: yyyyyyyh
 * @create: 2023-10-04
 * @Version 1.0
 **/
public class IDGenerator {

    /**
     * 1.0版本ID生成器（12位数字）
     * 类型 + 时间戳（天级） + 4位随机码
     * Type 2023 1105 0001
     */
    public static String generate12(String prefix) {
        String ymd = DateUtils.localDate2Str(LocalDate.now());
        ymd = ymd.replace("-", "");
        return prefix + ymd + random4();
    }

    /**
     * 2.0版本ID生成器（16位数字）
     * 类型 + 时间戳（分钟级） + 4位随机码
     * Type 2023 1105 2225 0001
     * 若业务量巨大，后续升级可换成毫秒级
     */
    public static String generate16(String prefix) {
        String ymdhm = DateUtils.getTimeNoSS().replaceAll("[[\\s-:punct:]]", "");
        return prefix + ymdhm + random4();
    }

    /**
     * 3.0版本ID生成器  （20位数字） 订单购物车用
     * 类型 + 时间戳（秒级） + 6位随机码  20位数字
     * Type 2023 1105 222509 000001
     * 若业务量巨大，后续升级可换成毫秒级
     */
    public static String generate20(String prefix) {
        String timeStr = DateUtils.getTime().replaceAll("[[\\s-:punct:]]", "");
        return prefix + timeStr + getRandomNum();
    }

    /**
     * 随机4位数
     **/
    private static String random4() {
        StringBuilder res = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int r = random.nextInt(9);
            res.append(r);
        }
        return res.toString();
    }

    /**
     * 随机生成六位数验证码
     *
     * @return
     */
    public static int getRandomNum() {
        Random r = new Random();
        return r.nextInt(900000) + 100000;//(int)(Math.random()*999999)
    }

    /**
    * 补全4位数
    * */
    public static String padNumber(int number) {
        String str = String.valueOf(number);

        if (str.length() < 4) {
            while (str.length() < 4) {
                str = "0".concat(str);
            }
        }

        return str;
    }

    /**
     * 获得UUID,支持集群
     */
    public static String getUUIDByUUId() {
        int machineId = 1;//最大支持1-9个集群机器部署
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if (hashCodeV < 0) {//有可能是负数
            hashCodeV = -hashCodeV;
        }
        return machineId + String.format("%015d", hashCodeV);
    }
}
